package service;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.ehcache.CacheKit;
import com.jfinal.plugin.ehcache.IDataLoader;

import config.model.Claim;
import config.model.Project;
import utils.FileUtils;

/**
 * 项目相关处理服务类
 * @author 陈凌志
 *
 */
public class ProjectService {

	/**
	 * 此方法用于申报项目时的信息存储
	 * @param project 要储存的项目信息
	 * @param projectId 项目临时编号
	 * 
	 */
	
	public String addProject(Project project,String projectId) {
		if((project.getOrganization()==null||project.getOrganization().equals(""))||
				(project.getName()==null||project.getName().equals(""))||
				(project.getOtherPeople()==null||project.getOtherPeople().equals(""))||
				(project.getNumber()==null)||
				(project.getTeacherName()==null||project.getTeacherName().equals(""))||
				(project.getTeacherTitle()==null||project.getTeacherTitle().equals(""))||
				(project.getCode()==null||project.getCode().equals(""))||
				(project.getPhone()==null||project.getPhone().equals(""))||
				(project.getTeacherPhone()==null||project.getTeacherPhone().equals(""))||
				(project.getIntroduction()==null||project.getIntroduction().equals(""))) {
			return "任何一项不能为空！";
		}else{
			String[] strs = project.getOtherPeople().split(",");
			Pattern pattern=Pattern.compile("[\\u4e00-\\u9fa5]+/\\d{14}");
			for (int i = 0; i < strs.length; i++) {
				Matcher ma=pattern.matcher(strs[i]);
				if(!ma.matches())
					return "其他成员格式不正确！";
			}
			String[] strs2 = project.getTeacherName().split(",");
			Pattern pattern2=Pattern.compile("[\\u4e00-\\u9fa5]+");
			for (int i = 0; i < strs2.length; i++) {
				Matcher ma=pattern2.matcher(strs2[i]);
				if(!ma.matches())
					return "教师姓名格式不正确！";
			}
			String[] strs3 = project.getTeacherTitle().split(",");
			if(strs2.length != strs3.length)
				return "教师职称与姓名数量不匹配";
			for (int i = 0; i < strs3.length; i++) {
				Matcher ma=pattern2.matcher(strs3[i]);
				if(!ma.matches())
					return "教师职称格式不正确！";
			}
			project.set("projectId", projectId)
			.set("levels", "校级")
			.set("provincial", "否")
			.set("status", "待审核立项")
			.save();
			CacheKit.removeAll("project");
			return "ok";
		}
	}


	/**
	 * 此方法用于生成项目临时编号
	 * @return String类型，为生成的临时编号
	 */
	
	public String lsID() {
		String id=lastID();
		//为空表面没有为立项的项目，所以临时编号ls00001
		if(id==null){
			id="ls00001";
		}else{
			id=getID(id);
		}
		return id;
	}
	
	/**
	 * 此方法用于在每一第一个未立项项目时生成临时的项目编号
	 * @param ID 最后一个项目的临时编号
	 * @return String类型，生成的临时编号
	 * 
	 */
	
	private String getID(String ID){
		String newID;
		String[] s=ID.split("ls");//讲ls去掉
		int number=Integer.parseInt(s[1])+1;//转换为数字，加一
		//添加0补齐5位数字
		newID=String.valueOf(number);
		int a=5-newID.length();
		for(int i=0;i<a;i++){
			newID="0"+newID;
		}
		newID="ls"+newID;//加上ls
		return newID;
	}
	
	/**
	 * 此方法用于查询最后一个未立项项目的临时编号
	 * @return String类型，最后一个未立项项目的临时编号
	 * 
	 */
	
	private String lastID() {
		List<Record> p = Db.find("select * from project where status = ? ","待审核立项");
		if(p.isEmpty())
			return null;
		else
			return p.get(p.size()-1).getStr("projectId");
	}
	
	/**
	 * 此方法用于获取项目年度区间
	 * @return String[]类型，所获取到的年度区间
	 * 
	 */
	
	public String[] getProjectYear() {
		int j = 0;
		int thisYear = Calendar.getInstance().get(Calendar.YEAR);
		String[] year = new String[thisYear-2017];
		for(int i=2018;i<=thisYear;i++) {
			year[j] = i+"";
			j++;
		}
		return year;
	}
	
	/**
	 * 此方法用于查询所负责的项目
	 * @param name 项目负责人名称
	 * @return List<Record>类型，为查询出的所负责项目信息
	 * 
	 */
	public List<Record> queryProjectByPersonsResponsibleName(String name) {
		List<Record> project = CacheKit.get("project", name+"project", new IDataLoader(){
		       public Object load() {
		           return Db.find("select * from project where personsResponsibleName = ? ",name);
		    }});
		return project;
	}
	
	/**
	 * 此方法用于查询所参与的项目
	 * @param name 项目参与人名称
	 * @param number 项目参与人学号
	 * @return List<Record>类型，为查询出的所参与项目信息
	 * 
	 */
	public List<Record> queryParticipate(String name,String number) {
		List<Record> project = CacheKit.get("project", "project"+name, new IDataLoader(){
		       public Object load() {
		           return Db.find("select * from project where otherPeople like ? ","%"+name+"/"+number+"%");
		    }});
		return project;
	}
	
	/**
	 * 此方法用于分页查询某个项目状态的项目
	 * @param status 要查询项目的项目状态
	 * @param pageNumber 当前页码
	 * @param year 项目年度
	 * @return Page<Record>类型，为查询出的所参与项目信息
	 * 
	 */
	public Page<Record> queryProjectByStatus(String status,int pageNumber,String year) {
		Page<Record> project = CacheKit.get("project", year+status+"project", new IDataLoader(){
		       public Object load() {
		           return Db.paginate(pageNumber, 5, "select *","from project where status = ? and year=?", status,year);
		    }});
		return project;
	}
	
	/**
	 * 此方法用于分页查询某个项目状态的项目
	 * @param status 要查询项目的项目状态
	 * @param pageNumber 当前页码
	 * @param year 项目年度
	 * @return Page<Record>类型，为查询出的所参与项目信息
	 * 
	 */
	public Page<Record> queryProjectByStatusAndGroup(String status,int pageNumber,String year) {
		Page<Record> project = CacheKit.get("project", year+status+"project", new IDataLoader(){
		       public Object load() {
		           return Db.paginate(pageNumber, 5, "select *","from project where status = ? and year=? and `group` is null", status,year);
		    }});
		return project;
	}
	
	
	/**
	 * 此方法用于分页查询某个分组的项目
	 * @param group 要查询项目的项目状态
	 * @param pageNumber 当前页码
	 * @param year 项目年度
	 * @return Page<Record>类型，为查询出的项目信息
	 * 
	 */
	public Page<Record> queryProjectByGroup(String group,int pageNumber,String year) {
		return Db.paginate(pageNumber, 5, "select *","from project where `group` = ? and year=?", group,year);
	}
	
	/**
	 * 此方法用于分页查询报销
	 * @param pageNumber 当前页码
	 * @return Page<Record>类型，为查询出的信息
	 * 
	 */
	public Page<Record> queryClaim(int pageNumber,String year) {
		Page<Record> project = Db.paginate(pageNumber, 5, "select *","from claim where year = ? and status = ?",year,"待审核");
		return project;
	}
	
	/**
	 * 此方法用于查询某个项目状态的项目
	 * @param status 要查询项目的项目状态
	 * @param year 项目年度
	 * @return List<Record>类型，为查询出的所参与项目信息
	 * 
	 */
	public List<Record> queryProjectByStatus(String status,int year) {
		return Db.find("select * from project where status = ? and year = ?",status,year);
	}
	
	/**
	 * 此方法用于查询某个项目ID的项目
	 * @param projectId 要查询项目的项目编号
	 * @return List<Record>类型，为查询出的所参与项目信息
	 * 
	 */
	public List<Record> queryProjectByProjectId(String projectId) {
		return Db.find("select * from project where projectId = ? ",projectId);
	}
	
	
	/**
	 * 此方法用于查询所有项目
	 * @param pageNumber 当前页码
	 * @return Page<Record>类型，为查询出的所有项目信息
	 * 
	 */
	public Page<Record> queryAllProject(int pageNumber) {
		Page<Record> project = CacheKit.get("project", "allproject"+pageNumber, new IDataLoader(){
		       public Object load() {
		           return Db.paginate(pageNumber, 5, "select *","from project");
		    }});
		return project;
	}
	
	
	/**
	 * 此方法用于搜索时的模糊查询
	 * @return 
	 * 
	 */
	public Page<Record> fuzzyQuery(String key,int pageNumber) {
		 return Db.paginate(pageNumber, 5
				 , "select *","from project where organization = ? or name like ? or type = ? or levels = ? or personsResponsibleName = ? or otherPeople like ? or teacherName like ? or status = ?"
				 ,key
				 ,"%"+key+"%"
				 ,key
				 ,key
				 ,key
				 ,"%"+key+"%"
				 ,"%"+key+"%"
				 ,key);
	}
	
	/**
	 * 此方法用于查询项目下的文件
	 * @param project List<Record>类型，需要查询的文件属于的项目
	 * @param type 需要查询的文件类别
	 * @return Map<String, String[]>类型，为查询出的项目下的文件，key为项目id，value为项目下的文件
	 * 
	 */
	public Map<String, String[]> getFileName(List<Record> project,String type) {
		Map<String, String[]> map = new HashMap<String, String[]>();
		FileUtils f = new FileUtils();
		for(int i=0;i<project.size();i++) {
			map.put(project.get(i).getStr("projectId"), f.getFileName(System.getProperty("user.dir")+"/WebRoot/file/project/"+project.get(i).getStr("projectId")+"/"+type));
		}
		return map;
	}
	
	/**
	 * 此方法用于项目的立项通过
	 * @param name 旧的项目ID
	 * @param newName 新的项目ID
	 * @param year 项目年度
	 * @return boolean类型，成功返回true，否则返回false
	 * 
	 */
	public boolean pass(String name,String newName,String year) {
		FileUtils f = new FileUtils();
		Db.update("update project set projectId = ? , status =? where projectId = ? ", newName,"立项",name);
		CacheKit.removeAll("project");
		f.DeleteFolder(System.getProperty("user.dir")+"/WebRoot/file/project/"+name+"/"+name+"application.zip");
		return f.rename(System.getProperty("user.dir")+"/WebRoot/file/project/", name, newName);
	}
	
	/**
	 * 此方法用于项目的分组
	 * @param projectId 项目ID
	 * @param group 组号
	 * @return boolean类型，成功返回true，否则返回false
	 * 
	 */
	public boolean updateGroup(String projectId,String group) {
		int i = Db.update("update project set `group` = ? where projectId = ? ",group,projectId);
		CacheKit.removeAll("project");
		return i == 1? true:false;
	}
	
	/**
	 * 此方法用于报销申请时的信息存储
	 * @param claim 要储存的报销信息
	 * @return boolean类型，成功返回true，否则返回false
	 * 
	 */
	
	public boolean addClaim(Claim claim) {
		return claim.set("status", "待审核").save();
	}
	/**
	 * 此方法用于项目的结项通过
	 * @param status 需要更改为什么状态（待审核结项，结项）
	 * @param projectId 项目ID
	 * @return boolean类型，成功返回true，否则返回false
	 * 
	 */
	public boolean End(String status,String projectId) {
		int	i = Db.update("update project set  status =?  where projectId = ? ",status,projectId);
		CacheKit.removeAll("project");
		return i == 1? true:false;
	}
	
	
	
	/**
	 * 此方法用于项目的结项通过
	 * @param status 需要更改为什么状态（待审核结项，结项）
	 * @param projectId 项目ID
	 * @param paper 论文信息
	 * @return boolean类型，成功返回true，否则返回false
	 * 
	 */
	public boolean End(String status,String projectId,String paper) {
		int i = 0;
		if(paper != null)
			i = Db.update("update project set  status =? , paper = ? where projectId = ? ",status,paper,projectId);
		else
			i = Db.update("update project set  status =?  where projectId = ? ",status,projectId);
		CacheKit.removeAll("project");
		return i == 1? true:false;
	}
	
	/**
	 * 此方法用于项目的结项通过
	 * @param projectId 项目ID
	 * @return boolean类型，成功返回true，否则返回false
	 * 
	 */
	public boolean claim(String projectId) {
		int i = Db.update("update claim set  status =? where projectId = ? and status = ?","通过",projectId,"待审核");
		CacheKit.removeAll("project");
		return i == 1? true:false;
	}
	
	/**
	 * 此方法用于项目的结项通过
	 * @param status 需要更改为什么状态（待审核结项，结项）
	 * @param projectId 项目ID
	 * @return boolean类型，成功返回true，否则返回false
	 * 
	 */
	public boolean changeProject(Project project) {
		project.setId(queryProjectByProjectId(project.getProjectId()).get(0).getInt("id"));
		boolean key = project.update();
		CacheKit.removeAll("project");
		return key;
	}
	
	/**
	 * 此方法用于添加文件后，把所有文件打包压缩为一个zip文件
	 * @param projectID 需要压缩文件的项目id
	 * @param type 需要压缩的文件类别
	 * @return boolean类型，成功返回true，失败返回false
	 * 
	 */
	public boolean fileToZip(String projectID,String type) {
		String sourceFilePath = System.getProperty("user.dir")+"/WebRoot/file/project/"+projectID+"/"+type;  
        String zipFilePath = System.getProperty("user.dir")+"/WebRoot/file/project/"+projectID;  
        String fileName = projectID+type;  
		FileUtils f = new FileUtils();
		f.DeleteFolder(System.getProperty("user.dir")+"/WebRoot/file/project/"+projectID+"/"+projectID+type+".zip");
		boolean flag = f.fileToZip(sourceFilePath, zipFilePath, fileName);  
		return flag;
	}
}
